﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace RTDP
{
    public static class RGB
    {
        public const int rPxl = 0;
        public const int gPxl = 1;
        public const int bPxl = 2;
        public const int PxlSize = 3;
    }

    public static class Gradient
    {
        public enum Theme
        {
            Gray,
            Orange,
            Rainbow
        };

        public const int TabSize = 256;

        #region Gradient tables
        public static byte[,] GrayTable = new byte[TabSize, RGB.PxlSize] {
            { 000, 000, 000 },
            { 001, 001, 001 },
            { 002, 002, 002 },
            { 003, 003, 003 },
            { 004, 004, 004 },
            { 005, 005, 005 },
            { 006, 006, 006 },
            { 007, 007, 007 },
            { 008, 008, 008 },
            { 009, 009, 009 },
            { 010, 010, 010 },
            { 011, 011, 011 },
            { 012, 012, 012 },
            { 013, 013, 013 },
            { 014, 014, 014 },
            { 015, 015, 015 },
            { 016, 016, 016 },
            { 017, 017, 017 },
            { 018, 018, 018 },
            { 019, 019, 019 },
            { 020, 020, 020 },
            { 021, 021, 021 },
            { 022, 022, 022 },
            { 023, 023, 023 },
            { 024, 024, 024 },
            { 025, 025, 025 },
            { 026, 026, 026 },
            { 027, 027, 027 },
            { 028, 028, 028 },
            { 029, 029, 029 },
            { 030, 030, 030 },
            { 031, 031, 031 },
            { 032, 032, 032 },
            { 033, 033, 033 },
            { 034, 034, 034 },
            { 035, 035, 035 },
            { 036, 036, 036 },
            { 037, 037, 037 },
            { 038, 038, 038 },
            { 039, 039, 039 },
            { 040, 040, 040 },
            { 041, 041, 041 },
            { 042, 042, 042 },
            { 043, 043, 043 },
            { 044, 044, 044 },
            { 045, 045, 045 },
            { 046, 046, 046 },
            { 047, 047, 047 },
            { 048, 048, 048 },
            { 049, 049, 049 },
            { 050, 050, 050 },
            { 051, 051, 051 },
            { 052, 052, 052 },
            { 053, 053, 053 },
            { 054, 054, 054 },
            { 055, 055, 055 },
            { 056, 056, 056 },
            { 057, 057, 057 },
            { 058, 058, 058 },
            { 059, 059, 059 },
            { 060, 060, 060 },
            { 061, 061, 061 },
            { 062, 062, 062 },
            { 063, 063, 063 },
            { 064, 064, 064 },
            { 065, 065, 065 },
            { 066, 066, 066 },
            { 067, 067, 067 },
            { 068, 068, 068 },
            { 069, 069, 069 },
            { 070, 070, 070 },
            { 071, 071, 071 },
            { 072, 072, 072 },
            { 073, 073, 073 },
            { 074, 074, 074 },
            { 075, 075, 075 },
            { 076, 076, 076 },
            { 077, 077, 077 },
            { 078, 078, 078 },
            { 079, 079, 079 },
            { 080, 080, 080 },
            { 081, 081, 081 },
            { 082, 082, 082 },
            { 083, 083, 083 },
            { 084, 084, 084 },
            { 085, 085, 085 },
            { 086, 086, 086 },
            { 087, 087, 087 },
            { 088, 088, 088 },
            { 089, 089, 089 },
            { 090, 090, 090 },
            { 091, 091, 091 },
            { 092, 092, 092 },
            { 093, 093, 093 },
            { 094, 094, 094 },
            { 095, 095, 095 },
            { 096, 096, 096 },
            { 097, 097, 097 },
            { 098, 098, 098 },
            { 099, 099, 099 },
            { 100, 100, 100 },
            { 101, 101, 101 },
            { 102, 102, 102 },
            { 103, 103, 103 },
            { 104, 104, 104 },
            { 105, 105, 105 },
            { 106, 106, 106 },
            { 107, 107, 107 },
            { 108, 108, 108 },
            { 109, 109, 109 },
            { 110, 110, 110 },
            { 111, 111, 111 },
            { 112, 112, 112 },
            { 113, 113, 113 },
            { 114, 114, 114 },
            { 115, 115, 115 },
            { 116, 116, 116 },
            { 117, 117, 117 },
            { 118, 118, 118 },
            { 119, 119, 119 },
            { 120, 120, 120 },
            { 121, 121, 121 },
            { 122, 122, 122 },
            { 123, 123, 123 },
            { 124, 124, 124 },
            { 125, 125, 125 },
            { 126, 126, 126 },
            { 127, 127, 127 },
            { 128, 128, 128 },
            { 129, 129, 129 },
            { 130, 130, 130 },
            { 131, 131, 131 },
            { 132, 132, 132 },
            { 133, 133, 133 },
            { 134, 134, 134 },
            { 135, 135, 135 },
            { 136, 136, 136 },
            { 137, 137, 137 },
            { 138, 138, 138 },
            { 139, 139, 139 },
            { 140, 140, 140 },
            { 141, 141, 141 },
            { 142, 142, 142 },
            { 143, 143, 143 },
            { 144, 144, 144 },
            { 145, 145, 145 },
            { 146, 146, 146 },
            { 147, 147, 147 },
            { 148, 148, 148 },
            { 149, 149, 149 },
            { 150, 150, 150 },
            { 151, 151, 151 },
            { 152, 152, 152 },
            { 153, 153, 153 },
            { 154, 154, 154 },
            { 155, 155, 155 },
            { 156, 156, 156 },
            { 157, 157, 157 },
            { 158, 158, 158 },
            { 159, 159, 159 },
            { 160, 160, 160 },
            { 161, 161, 161 },
            { 162, 162, 162 },
            { 163, 163, 163 },
            { 164, 164, 164 },
            { 165, 165, 165 },
            { 166, 166, 166 },
            { 167, 167, 167 },
            { 168, 168, 168 },
            { 169, 169, 169 },
            { 170, 170, 170 },
            { 171, 171, 171 },
            { 172, 172, 172 },
            { 173, 173, 173 },
            { 174, 174, 174 },
            { 175, 175, 175 },
            { 176, 176, 176 },
            { 177, 177, 177 },
            { 178, 178, 178 },
            { 179, 179, 179 },
            { 180, 180, 180 },
            { 181, 181, 181 },
            { 182, 182, 182 },
            { 183, 183, 183 },
            { 184, 184, 184 },
            { 185, 185, 185 },
            { 186, 186, 186 },
            { 187, 187, 187 },
            { 188, 188, 188 },
            { 189, 189, 189 },
            { 190, 190, 190 },
            { 191, 191, 191 },
            { 192, 192, 192 },
            { 193, 193, 193 },
            { 194, 194, 194 },
            { 195, 195, 195 },
            { 196, 196, 196 },
            { 197, 197, 197 },
            { 198, 198, 198 },
            { 199, 199, 199 },
            { 200, 200, 200 },
            { 201, 201, 201 },
            { 202, 202, 202 },
            { 203, 203, 203 },
            { 204, 204, 204 },
            { 205, 205, 205 },
            { 206, 206, 206 },
            { 207, 207, 207 },
            { 208, 208, 208 },
            { 209, 209, 209 },
            { 210, 210, 210 },
            { 211, 211, 211 },
            { 212, 212, 212 },
            { 213, 213, 213 },
            { 214, 214, 214 },
            { 215, 215, 215 },
            { 216, 216, 216 },
            { 217, 217, 217 },
            { 218, 218, 218 },
            { 219, 219, 219 },
            { 220, 220, 220 },
            { 221, 221, 221 },
            { 222, 222, 222 },
            { 223, 223, 223 },
            { 224, 224, 224 },
            { 225, 225, 225 },
            { 226, 226, 226 },
            { 227, 227, 227 },
            { 228, 228, 228 },
            { 229, 229, 229 },
            { 230, 230, 230 },
            { 231, 231, 231 },
            { 232, 232, 232 },
            { 233, 233, 233 },
            { 234, 234, 234 },
            { 235, 235, 235 },
            { 236, 236, 236 },
            { 237, 237, 237 },
            { 238, 238, 238 },
            { 239, 239, 239 },
            { 240, 240, 240 },
            { 241, 241, 241 },
            { 242, 242, 242 },
            { 243, 243, 243 },
            { 244, 244, 244 },
            { 245, 245, 245 },
            { 246, 246, 246 },
            { 247, 247, 247 },
            { 248, 248, 248 },
            { 249, 249, 249 },
            { 250, 250, 250 },
            { 251, 251, 251 },
            { 252, 252, 252 },
            { 253, 253, 253 },
            { 254, 254, 254 },
            { 255, 255, 255 }
       };

        public static byte[,] RainbowTable = new byte[TabSize, RGB.PxlSize] {
            { 001, 009, 058 },
            { 000, 000, 063 },
            { 004, 007, 074 },
            { 002, 000, 073 },
            { 003, 004, 086 },
            { 000, 004, 077 },
            { 000, 004, 078 },
            { 000, 002, 077 },
            { 000, 004, 078 },
            { 000, 005, 078 },
            { 001, 004, 083 },
            { 005, 004, 080 },
            { 001, 004, 081 },
            { 004, 007, 086 },
            { 002, 008, 092 },
            { 004, 015, 097 },
            { 005, 022, 104 },
            { 003, 028, 108 },
            { 004, 031, 110 },
            { 000, 033, 110 },
            { 000, 039, 108 },
            { 000, 042, 114 },
            { 000, 045, 112 },
            { 000, 049, 125 },
            { 002, 052, 137 },
            { 000, 050, 135 },
            { 001, 052, 133 },
            { 001, 052, 133 },
            { 000, 053, 133 },
            { 002, 055, 135 },
            { 000, 053, 133 },
            { 001, 057, 142 },
            { 001, 059, 141 },
            { 000, 061, 142 },
            { 000, 065, 151 },
            { 000, 067, 154 },
            { 000, 065, 157 },
            { 000, 066, 157 },
            { 000, 066, 162 },
            { 000, 068, 163 },
            { 000, 067, 166 },
            { 002, 072, 170 },
            { 003, 072, 173 },
            { 005, 074, 175 },
            { 003, 074, 178 },
            { 002, 076, 181 },
            { 004, 076, 186 },
            { 009, 081, 191 },
            { 006, 083, 189 },
            { 007, 085, 193 },
            { 007, 090, 196 },
            { 006, 088, 196 },
            { 004, 089, 198 },
            { 003, 090, 195 },
            { 004, 093, 195 },
            { 002, 094, 205 },
            { 002, 094, 203 },
            { 000, 097, 208 },
            { 001, 102, 210 },
            { 001, 103, 211 },
            { 001, 103, 211 },
            { 002, 102, 213 },
            { 001, 105, 216 },
            { 003, 108, 215 },
            { 004, 110, 219 },
            { 002, 114, 214 },
            { 000, 118, 214 },
            { 000, 118, 212 },
            { 000, 116, 209 },
            { 000, 118, 206 },
            { 000, 120, 206 },
            { 000, 121, 202 },
            { 000, 122, 199 },
            { 004, 128, 202 },
            { 007, 127, 205 },
            { 007, 128, 211 },
            { 003, 131, 192 },
            { 000, 132, 191 },
            { 002, 131, 186 },
            { 002, 132, 182 },
            { 002, 135, 170 },
            { 005, 139, 164 },
            { 006, 143, 161 },
            { 006, 142, 154 },
            { 006, 145, 152 },
            { 008, 143, 147 },
            { 006, 143, 136 },
            { 007, 143, 133 },
            { 011, 145, 136 },
            { 020, 146, 122 },
            { 030, 147, 118 },
            { 034, 149, 110 },
            { 042, 150, 101 },
            { 051, 151, 087 },
            { 057, 152, 084 },
            { 062, 155, 084 },
            { 061, 158, 081 },
            { 068, 169, 051 },
            { 074, 170, 045 },
            { 079, 171, 044 },
            { 083, 172, 042 },
            { 088, 175, 036 },
            { 094, 179, 026 },
            { 101, 176, 023 },
            { 105, 175, 027 },
            { 109, 181, 019 },
            { 118, 179, 016 },
            { 117, 183, 015 },
            { 114, 189, 011 },
            { 117, 192, 013 },
            { 124, 192, 011 },
            { 131, 191, 005 },
            { 134, 193, 005 },
            { 145, 196, 003 },
            { 151, 197, 002 },
            { 156, 200, 001 },
            { 162, 200, 003 },
            { 164, 200, 004 },
            { 167, 199, 000 },
            { 166, 198, 001 },
            { 173, 204, 004 },
            { 176, 204, 005 },
            { 180, 205, 002 },
            { 187, 210, 006 },
            { 188, 209, 006 },
            { 188, 212, 004 },
            { 192, 212, 000 },
            { 194, 209, 004 },
            { 214, 208, 000 },
            { 215, 208, 004 },
            { 216, 209, 015 },
            { 213, 209, 013 },
            { 214, 213, 011 },
            { 213, 213, 005 },
            { 216, 212, 000 },
            { 223, 211, 001 },
            { 227, 206, 001 },
            { 231, 201, 009 },
            { 231, 201, 017 },
            { 218, 211, 009 },
            { 226, 207, 016 },
            { 226, 211, 008 },
            { 228, 217, 003 },
            { 225, 207, 009 },
            { 234, 215, 001 },
            { 232, 203, 015 },
            { 232, 204, 009 },
            { 233, 206, 001 },
            { 234, 206, 011 },
            { 233, 205, 000 },
            { 234, 203, 001 },
            { 238, 197, 007 },
            { 241, 194, 016 },
            { 235, 197, 024 },
            { 242, 188, 017 },
            { 240, 188, 008 },
            { 250, 186, 003 },
            { 242, 187, 006 },
            { 246, 186, 014 },
            { 246, 180, 021 },
            { 254, 168, 019 },
            { 231, 179, 031 },
            { 242, 179, 026 },
            { 241, 177, 009 },
            { 250, 163, 021 },
            { 250, 158, 023 },
            { 250, 161, 017 },
            { 247, 160, 021 },
            { 236, 163, 032 },
            { 255, 153, 022 },
            { 244, 154, 032 },
            { 249, 150, 033 },
            { 253, 143, 030 },
            { 241, 147, 023 },
            { 250, 136, 039 },
            { 250, 131, 029 },
            { 252, 124, 033 },
            { 249, 121, 034 },
            { 252, 109, 030 },
            { 253, 104, 024 },
            { 245, 106, 025 },
            { 237, 107, 021 },
            { 255, 084, 054 },
            { 249, 089, 055 },
            { 248, 081, 047 },
            { 235, 087, 047 },
            { 253, 065, 040 },
            { 252, 065, 046 },
            { 244, 064, 049 },
            { 242, 061, 052 },
            { 254, 042, 090 },
            { 247, 033, 061 },
            { 248, 037, 043 },
            { 254, 041, 043 },
            { 243, 030, 062 },
            { 255, 028, 045 },
            { 246, 030, 053 },
            { 241, 035, 058 },
            { 252, 019, 076 },
            { 229, 037, 036 },
            { 245, 031, 069 },
            { 244, 023, 064 },
            { 254, 024, 062 },
            { 246, 017, 082 },
            { 239, 027, 067 },
            { 234, 027, 073 },
            { 231, 027, 078 },
            { 246, 031, 036 },
            { 252, 016, 090 },
            { 252, 021, 089 },
            { 254, 026, 089 },
            { 240, 043, 061 },
            { 241, 041, 104 },
            { 248, 041, 097 },
            { 254, 037, 080 },
            { 250, 054, 090 },
            { 229, 065, 090 },
            { 242, 051, 094 },
            { 248, 057, 100 },
            { 222, 084, 107 },
            { 252, 074, 106 },
            { 253, 086, 103 },
            { 253, 085, 108 },
            { 252, 080, 120 },
            { 237, 100, 116 },
            { 246, 100, 113 },
            { 252, 101, 108 },
            { 254, 101, 104 },
            { 236, 131, 099 },
            { 249, 128, 109 },
            { 246, 128, 114 },
            { 252, 121, 126 },
            { 248, 136, 135 },
            { 237, 140, 124 },
            { 245, 142, 125 },
            { 244, 144, 128 },
            { 249, 154, 136 },
            { 245, 157, 143 },
            { 254, 164, 140 },
            { 250, 168, 144 },
            { 253, 167, 150 },
            { 252, 176, 150 },
            { 248, 184, 159 },
            { 254, 187, 161 },
            { 255, 191, 155 },
            { 254, 196, 159 },
            { 252, 195, 176 },
            { 250, 203, 173 },
            { 253, 202, 171 },
            { 252, 211, 183 },
            { 255, 215, 189 },
            { 254, 218, 196 },
            { 249, 222, 192 },
            { 253, 227, 204 },
            { 241, 226, 193 },
            { 249, 212, 193 }
        };

        public static byte[,] OrangeTable = new byte[TabSize, RGB.PxlSize] {
            { 009, 008, 024 },
            { 002, 000, 021 },
            { 000, 000, 026 },
            { 003, 001, 038 },
            { 002, 000, 047 },
            { 000, 000, 056 },
            { 001, 001, 065 },
            { 001, 000, 070 },
            { 001, 001, 075 },
            { 001, 000, 078 },
            { 002, 000, 083 },
            { 003, 000, 087 },
            { 005, 000, 094 },
            { 005, 000, 097 },
            { 006, 000, 100 },
            { 006, 000, 102 },
            { 009, 000, 105 },
            { 010, 001, 108 },
            { 013, 001, 113 },
            { 014, 001, 117 },
            { 016, 000, 122 },
            { 020, 001, 126 },
            { 022, 001, 128 },
            { 023, 001, 128 },
            { 027, 001, 128 },
            { 031, 000, 129 },
            { 033, 000, 130 },
            { 038, 001, 133 },
            { 041, 001, 136 },
            { 045, 001, 140 },
            { 048, 001, 143 },
            { 050, 001, 145 },
            { 054, 000, 144 },
            { 058, 000, 146 },
            { 061, 001, 148 },
            { 064, 002, 149 },
            { 065, 001, 147 },
            { 068, 000, 147 },
            { 070, 000, 148 },
            { 074, 000, 149 },
            { 076, 000, 150 },
            { 080, 000, 151 },
            { 084, 000, 150 },
            { 088, 000, 151 },
            { 090, 000, 152 },
            { 091, 000, 153 },
            { 094, 001, 154 },
            { 097, 002, 156 },
            { 101, 000, 154 },
            { 103, 000, 153 },
            { 105, 000, 154 },
            { 107, 000, 155 },
            { 110, 001, 156 },
            { 114, 000, 157 },
            { 116, 001, 158 },
            { 119, 000, 158 },
            { 121, 000, 157 },
            { 125, 000, 158 },
            { 129, 001, 158 },
            { 131, 000, 158 },
            { 134, 000, 157 },
            { 135, 000, 155 },
            { 139, 001, 156 },
            { 142, 001, 157 },
            { 147, 000, 155 },
            { 150, 000, 154 },
            { 153, 000, 155 },
            { 154, 000, 156 },
            { 155, 000, 154 },
            { 157, 000, 154 },
            { 159, 000, 154 },
            { 163, 000, 153 },
            { 165, 000, 152 },
            { 168, 000, 152 },
            { 169, 000, 150 },
            { 172, 000, 151 },
            { 174, 000, 151 },
            { 175, 001, 152 },
            { 177, 000, 150 },
            { 179, 001, 151 },
            { 180, 000, 149 },
            { 182, 000, 147 },
            { 183, 001, 148 },
            { 184, 002, 149 },
            { 186, 002, 148 },
            { 187, 004, 148 },
            { 188, 005, 147 },
            { 188, 005, 145 },
            { 192, 007, 145 },
            { 192, 007, 144 },
            { 195, 009, 144 },
            { 197, 011, 144 },
            { 197, 012, 142 },
            { 196, 011, 141 },
            { 196, 011, 139 },
            { 198, 013, 140 },
            { 199, 015, 135 },
            { 200, 017, 133 },
            { 202, 020, 131 },
            { 202, 021, 128 },
            { 204, 022, 123 },
            { 204, 023, 120 },
            { 206, 025, 120 },
            { 207, 026, 119 },
            { 207, 027, 118 },
            { 208, 028, 115 },
            { 212, 031, 112 },
            { 213, 032, 109 },
            { 215, 035, 106 },
            { 216, 037, 102 },
            { 216, 038, 096 },
            { 216, 039, 093 },
            { 219, 043, 092 },
            { 220, 044, 090 },
            { 221, 046, 085 },
            { 222, 049, 079 },
            { 222, 051, 070 },
            { 222, 052, 063 },
            { 223, 054, 059 },
            { 224, 056, 055 },
            { 225, 058, 050 },
            { 225, 059, 045 },
            { 225, 060, 040 },
            { 226, 062, 034 },
            { 227, 064, 029 },
            { 229, 068, 026 },
            { 230, 070, 022 },
            { 231, 071, 021 },
            { 230, 073, 020 },
            { 230, 075, 019 },
            { 231, 076, 019 },
            { 231, 077, 015 },
            { 232, 077, 013 },
            { 233, 078, 011 },
            { 235, 081, 011 },
            { 237, 083, 009 },
            { 237, 085, 009 },
            { 238, 087, 008 },
            { 238, 089, 007 },
            { 238, 089, 005 },
            { 236, 090, 004 },
            { 236, 092, 005 },
            { 235, 094, 006 },
            { 236, 095, 005 },
            { 238, 098, 001 },
            { 238, 098, 000 },
            { 238, 100, 001 },
            { 240, 102, 003 },
            { 240, 104, 002 },
            { 241, 105, 003 },
            { 242, 107, 002 },
            { 243, 108, 001 },
            { 242, 110, 001 },
            { 242, 112, 000 },
            { 244, 114, 000 },
            { 245, 115, 001 },
            { 243, 116, 000 },
            { 244, 118, 000 },
            { 245, 120, 000 },
            { 246, 121, 001 },
            { 247, 125, 002 },
            { 246, 127, 001 },
            { 246, 129, 000 },
            { 248, 131, 002 },
            { 247, 133, 001 },
            { 247, 133, 001 },
            { 247, 135, 001 },
            { 247, 135, 001 },
            { 248, 138, 001 },
            { 248, 138, 000 },
            { 247, 140, 000 },
            { 247, 142, 000 },
            { 247, 145, 000 },
            { 249, 147, 002 },
            { 250, 148, 003 },
            { 251, 149, 002 },
            { 251, 151, 001 },
            { 251, 152, 000 },
            { 253, 156, 000 },
            { 254, 160, 003 },
            { 254, 162, 003 },
            { 252, 163, 001 },
            { 252, 165, 000 },
            { 252, 169, 001 },
            { 251, 171, 000 },
            { 249, 172, 000 },
            { 249, 174, 000 },
            { 250, 175, 000 },
            { 252, 177, 000 },
            { 253, 178, 001 },
            { 254, 179, 002 },
            { 254, 179, 000 },
            { 255, 182, 000 },
            { 255, 185, 001 },
            { 255, 187, 000 },
            { 255, 188, 001 },
            { 255, 190, 000 },
            { 255, 192, 001 },
            { 254, 194, 000 },
            { 254, 196, 000 },
            { 254, 198, 000 },
            { 252, 199, 000 },
            { 252, 201, 000 },
            { 253, 204, 003 },
            { 253, 206, 004 },
            { 253, 206, 004 },
            { 253, 208, 005 },
            { 254, 209, 006 },
            { 253, 211, 005 },
            { 255, 213, 007 },
            { 254, 213, 009 },
            { 254, 213, 009 },
            { 253, 214, 012 },
            { 255, 218, 016 },
            { 255, 219, 019 },
            { 253, 219, 023 },
            { 255, 223, 027 },
            { 253, 223, 031 },
            { 253, 224, 036 },
            { 255, 225, 041 },
            { 255, 226, 044 },
            { 253, 226, 047 },
            { 253, 228, 050 },
            { 254, 231, 057 },
            { 254, 231, 063 },
            { 255, 234, 071 },
            { 254, 234, 075 },
            { 255, 234, 081 },
            { 255, 237, 090 },
            { 255, 236, 097 },
            { 254, 236, 102 },
            { 255, 240, 110 },
            { 255, 240, 115 },
            { 255, 240, 121 },
            { 255, 242, 128 },
            { 255, 242, 137 },
            { 255, 243, 145 },
            { 254, 243, 153 },
            { 255, 245, 160 },
            { 254, 245, 168 },
            { 254, 246, 174 },
            { 254, 246, 181 },
            { 253, 247, 187 },
            { 254, 247, 193 },
            { 254, 248, 200 },
            { 255, 248, 204 },
            { 254, 249, 211 },
            { 255, 251, 216 },
            { 255, 252, 219 },
            { 255, 253, 224 },
            { 253, 251, 228 },
            { 255, 255, 237 },
            { 254, 254, 242 },
            { 255, 255, 247 },
            { 253, 253, 251 },
            { 232, 232, 232 }};

        //public static byte[,] blueGradient = new byte[GRADIENT_TAB_SIZE, PXL_SIZE] {
        //    {   0,   0, 252 }, // Blue
        //    {   6,   0, 252 },
        //    {  12,   0, 252 },
        //    {  18,   0, 252 },
        //    {  24,   0, 252 },
        //    {  30,   0, 252 },
        //    {  36,   0, 252 },
        //    {  42,   0, 252 },
        //    {  48,   0, 252 },
        //    {  54,   0, 252 },
        //    {  60,   0, 252 },
        //    {  66,   0, 252 },
        //    {  72,   0, 252 },
        //    {  78,   0, 252 },
        //    {  84,   0, 252 },
        //    {  90,   0, 252 },
        //    {  96,   0, 252 },
        //    { 102,   0, 252 },
        //    { 108,   0, 252 },
        //    { 114,   0, 252 },
        //    { 120,   0, 252 },
        //    { 126,   0, 252 }, // Violet
        //    { 132,   0, 252 },
        //    { 138,   0, 252 },
        //    { 144,   0, 252 },
        //    { 150,   0, 252 },
        //    { 156,   0, 252 },
        //    { 162,   0, 252 },
        //    { 168,   0, 252 },
        //    { 174,   0, 252 },
        //    { 180,   0, 252 },
        //    { 186,   0, 252 },
        //    { 192,   0, 252 },
        //    { 198,   0, 252 },
        //    { 204,   0, 252 },
        //    { 210,   0, 252 },
        //    { 216,   0, 252 },
        //    { 222,   0, 252 },
        //    { 228,   0, 252 },
        //    { 234,   0, 252 },
        //    { 240,   0, 252 },
        //    { 246,   0, 252 },
        //    { 252,   0, 252 }, // Magenta
        //    { 252,   0, 246 },  
        //    { 252,   0, 240 },
        //    { 252,   0, 234 },
        //    { 252,   0, 228 },
        //    { 252,   0, 222 },
        //    { 252,   0, 216 },
        //    { 252,   0, 210 },
        //    { 252,   0, 204 },
        //    { 252,   0, 198 },
        //    { 252,   0, 192 },
        //    { 252,   0, 186 },
        //    { 252,   0, 180 },
        //    { 252,   0, 174 },
        //    { 252,   0, 168 },
        //    { 252,   0, 162 },
        //    { 252,   0, 156 },
        //    { 252,   0, 150 }, 
        //    { 252,   0, 144 },
        //    { 252,   0, 138 },
        //    { 252,   0, 132 },
        //    { 252,   0, 126 }, // Raspberry
        //    { 252,   0, 120 },
        //    { 252,   0, 114 },
        //    { 252,   0, 108 },
        //    { 252,   0, 102 },
        //    { 252,   0,  96 },
        //    { 252,   0,  90 },
        //    { 252,   0,  84 },
        //    { 252,   0,  78 },
        //    { 252,   0,  72 },
        //    { 252,   0,  66 },
        //    { 252,   0,  60 },
        //    { 252,   0,  54 }, 
        //    { 252,   0,  48 },
        //    { 252,   0,  42 },
        //    { 252,   0,  36 },
        //    { 252,   0,  30 },
        //    { 252,   0,  24 },
        //    { 252,   0,  18 },
        //    { 252,   0,  12 },
        //    { 252,   0,   6 },
        //    { 252,   0,   0 }, // Red
        //    { 252,   6,   0 },
        //    { 252,  12,   0 },
        //    { 252,  18,   0 },
        //    { 252,  24,   0 },
        //    { 252,  30,   0 },
        //    { 252,  36,   0 },
        //    { 252,  42,   0 },
        //    { 252,  48,   0 },
        //    { 252,  54,   0 },
        //    { 252,  60,   0 },
        //    { 252,  66,   0 },
        //    { 252,  72,   0 },
        //    { 252,  78,   0 },
        //    { 252,  84,   0 },
        //    { 252,  90,   0 },
        //    { 252,  96,   0 },
        //    { 252, 102,   0 },
        //    { 252, 108,   0 },
        //    { 252, 114,   0 },
        //    { 252, 120,   0 },
        //    { 252, 126,   0 }, // Orange
        //    { 252, 132,   0 },
        //    { 252, 138,   0 },
        //    { 252, 144,   0 },
        //    { 252, 150,   0 },
        //    { 252, 156,   0 },
        //    { 252, 162,   0 },
        //    { 252, 168,   0 },
        //    { 252, 174,   0 },
        //    { 252, 180,   0 },
        //    { 252, 186,   0 }, 
        //    { 252, 192,   0 },
        //    { 252, 198,   0 },
        //    { 252, 204,   0 },
        //    { 252, 210,   0 },
        //    { 252, 216,   0 },
        //    { 252, 222,   0 },
        //    { 252, 228,   0 },
        //    { 252, 234,   0 },
        //    { 252, 240,   0 },
        //    { 252, 246,   0 },
        //    { 252, 252,   0 }, // Yellow
        //    { 255, 255, 255 } 
        //};

        //public static byte[,] greenGradient = new byte[GRADIENT_TAB_SIZE, PXL_SIZE] {
        //    {   0, 252,   0 }, // Green
        //    {   6, 252,   0 },
        //    {  12, 252,   0 },
        //    {  18, 252,   0 },
        //    {  24, 252,   0 },
        //    {  30, 252,   0 },
        //    {  36, 252,   0 },
        //    {  42, 252,   0 },
        //    {  48, 252,   0 },
        //    {  54, 252,   0 },
        //    {  60, 252,   0 },
        //    {  66, 252,   0 },
        //    {  72, 252,   0 },
        //    {  78, 252,   0 },
        //    {  84, 252,   0 },
        //    {  90, 252,   0 },
        //    {  96, 252,   0 },
        //    { 102, 252,   0 },
        //    { 108, 252,   0 },
        //    { 114, 252,   0 },
        //    { 120, 252,   0 },
        //    { 126, 252,   0 }, // Spring Green
        //    { 132, 252,   0 },
        //    { 138, 252,   0 },
        //    { 144, 252,   0 },
        //    { 150, 252,   0 },
        //    { 156, 252,   0 },
        //    { 162, 252,   0 },
        //    { 168, 252,   0 },
        //    { 174, 252,   0 },
        //    { 180, 252,   0 },
        //    { 186, 252,   0 },
        //    { 192, 252,   0 },
        //    { 198, 252,   0 },
        //    { 204, 252,   0 },
        //    { 210, 252,   0 },
        //    { 216, 252,   0 },
        //    { 222, 252,   0 },
        //    { 228, 252,   0 },
        //    { 234, 252,   0 },
        //    { 240, 252,   0 },
        //    { 246, 252,   0 },
        //    { 252, 252,   0 }, // Yelow
        //    { 252, 246,   0 },  
        //    { 252, 240,   0 },
        //    { 252, 234,   0 },
        //    { 252, 228,   0 },
        //    { 252, 222,   0 },
        //    { 252, 216,   0 },
        //    { 252, 210,   0 },
        //    { 252, 204,   0 },
        //    { 252, 198,   0 },
        //    { 252, 192,   0 },
        //    { 252, 186,   0 },
        //    { 252, 180,   0 },
        //    { 252, 174,   0 },
        //    { 252, 168,   0 },
        //    { 252, 162,   0 },
        //    { 252, 156,   0 },
        //    { 252, 150,   0 }, 
        //    { 252, 144,   0 },
        //    { 252, 138,   0 },
        //    { 252, 132,   0 },
        //    { 252, 126,   0 }, // Orange
        //    { 252, 120,   0 },
        //    { 252, 114,   0 },
        //    { 252, 108,   0 },
        //    { 252, 102,   0 },
        //    { 252,  96,   0 },
        //    { 252,  90,   0 },
        //    { 252,  84,   0 },
        //    { 252,  78,   0 },
        //    { 252,  72,   0 },
        //    { 252,  66,   0 },
        //    { 252,  60,   0 },
        //    { 252,  54,   0 }, 
        //    { 252,  48,   0 },
        //    { 252,  42,   0 },
        //    { 252,  36,   0 },
        //    { 252,  30,   0 },
        //    { 252,  24,   0 },
        //    { 252,  18,   0 },
        //    { 252,  12,   0 },
        //    { 252,   6,   0 },
        //    { 252,   0,   0 }, // Red
        //    { 252,   0,   6 },
        //    { 252,   0,  12 },
        //    { 252,   0,  18 },
        //    { 252,   0,  24 },
        //    { 252,   0,  30 },
        //    { 252,   0,  36 },
        //    { 252,   0,  42 },
        //    { 252,   0,  48 },
        //    { 252,   0,  54 },
        //    { 252,   0,  60 },
        //    { 252,   0,  66 },
        //    { 252,   0,  72 },
        //    { 252,   0,  78 },
        //    { 252,   0,  84 },
        //    { 252,   0,  90 },
        //    { 252,   0,  96 },
        //    { 252,   0, 102 },
        //    { 252,   0, 108 },
        //    { 252,   0, 114 },
        //    { 252,   0, 120 },
        //    { 252,   0, 126 }, // Raspberry
        //    { 252,   0, 132 },
        //    { 252,   0, 138 },
        //    { 252,   0, 144 },
        //    { 252,   0, 150 },
        //    { 252,   0, 156 },
        //    { 252,   0, 162 },
        //    { 252,   0, 168 },
        //    { 252,   0, 174 },
        //    { 252,   0, 180 },
        //    { 252,   0, 186 },
        //    { 252,   0, 192 },
        //    { 252,   0, 198 },
        //    { 252,   0, 204 },
        //    { 252,   0, 210 },
        //    { 252,   0, 216 },
        //    { 252,   0, 222 },
        //    { 252,   0, 228 },
        //    { 252,   0, 234 },
        //    { 252,   0, 240 },
        //    { 252,   0, 246 },
        //    { 252,   0, 252 }, // Magenta
        //    { 255,   0, 255 }
        //};

        //public static byte[,] Gradient;

        //static RGB()
        //{
        //    Gradient = new byte[GRADIENT_TAB_SIZE, PXL_SIZE];

        //    int step = 3;
        //    int maxval = 254;
        //    int medval = 127;
        //    int r, g, b, i;

        //    // Black -> Blue
        //    r = g = b = 0;
        //    for (i = 0; b <= medval; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        b += step;
        //    }

        //    // Blue -> Violet
        //    for (; b <= maxval; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        r += step;
        //        b += step;
        //    }

        //    // Violet -> Magenta -> Raspberry
        //    b = maxval;
        //    for (; r <= maxval; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        r += step;
        //        b -= step;
        //    }

        //    // Raspberry -> Red -> Orange
        //    r = maxval;
        //    for (; b >= 0; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        g += step;
        //        b -= step;
        //    }

        //    // Orange -> Yellow
        //    b = 0;
        //    for (; g <= maxval; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        g += step;
        //        b += step;
        //    }

        //    // Yellow -> White
        //    g = maxval;
        //    for (; (b <= maxval) && (i < GRADIENT_TAB_SIZE); i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //        b += step;
        //    }

        //    // White
        //    r = g = b = maxval;
        //    for (; i < GRADIENT_TAB_SIZE; i++)
        //    {
        //        Gradient[i, R_PXL] = (byte)r;
        //        Gradient[i, G_PXL] = (byte)g;
        //        Gradient[i, B_PXL] = (byte)b;
        //    }
        //}
        #endregion

     }

    public class IrGradient
    {
        float tmin;       // min temp in gradient bitmap 
        float tmax;       // max temp in gradient bitmap 
        float span;

        byte[,] gradient_tab;

        public IrGradient(Gradient.Theme theme, float tmin, float tmax)
        {
            if (theme == Gradient.Theme.Gray)
                gradient_tab = Gradient.GrayTable;
            else if (theme == Gradient.Theme.Orange)
                gradient_tab = Gradient.OrangeTable;
            else if (theme == Gradient.Theme.Rainbow)
                gradient_tab = Gradient.OrangeTable;

            this.tmin = tmin;
            this.tmax = tmax;
            this.span = Gradient.TabSize / (tmax - tmin);
        }
        
        public void Temp2BGR(float temp, ref byte b, ref byte g, ref byte r)
        {
            float sval = (temp - tmin) * span;
            int nval;

            if (sval <= 0)
                nval = 0;
            else if (sval >= Gradient.TabSize - 1)
                nval = Gradient.TabSize - 1;
            else
                nval = (int)sval;

            r = gradient_tab[nval, RGB.rPxl];
            g = gradient_tab[nval, RGB.gPxl];
            b = gradient_tab[nval, RGB.bPxl];
        }

        private void WriteGradientImage()
        {
            Bitmap bmp = new Bitmap(Gradient.TabSize, Gradient.TabSize, PixelFormat.Format24bppRgb);
            BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
            unsafe
            {
                byte* rgbptr = (byte*)(bmp_data.Scan0);
                for (int y = 0, i = Gradient.TabSize - 1; y < Gradient.TabSize; y++, i--)
                {
                    for (int x = 0; x < Gradient.TabSize; x++)
                    {
                        *rgbptr++ = gradient_tab[i, RGB.bPxl];  // BLUE
                        *rgbptr++ = gradient_tab[i, RGB.gPxl];  // GREEN
                        *rgbptr++ = gradient_tab[i, RGB.rPxl];  // RED
                    }
                    rgbptr += bmp_data.Stride - bmp_data.Width * 3;
                }
            }
            bmp.UnlockBits(bmp_data);
            bmp.Save("gradient.jpg");
        }
    }
}
